#Область ПрограммныйИнтерфейс

// Разбивает строку на несколько строк по указанному разделителю. Разделитель может иметь любую длину.
// В случаях, когда разделителем является строка из одного символа, и не используется параметр СокращатьНепечатаемыеСимволы,
// рекомендуется использовать функцию платформы СтрРазделить.
//
// Параметры:
//  Значение               - Строка - текст с разделителями;
//  Разделитель            - Строка - разделитель строк текста, минимум 1 символ;
//  ПропускатьПустыеСтроки - Булево - признак необходимости включения в результат пустых строк.
//    Если параметр не задан, то функция работает в режиме совместимости со своей предыдущей версией:
//     - для разделителя-пробела пустые строки не включаются в результат, для остальных разделителей пустые строки
//       включаются в результат.
//     - если параметр Строка не содержит значащих символов или не содержит ни одного символа (пустая строка), то в
//       случае разделителя-пробела результатом функции будет массив, содержащий одно значение "" (пустая строка), а
//       при других разделителях результатом функции будет пустой массив.
//  СокращатьНепечатаемыеСимволы - Булево - сокращать непечатаемые символы по краям каждой из найденных подстрок.
//
// Возвращаемое значение:
//  Массив - массив строк.
//
// Пример:
//  СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(",один,,два,", ",")
//  - возвратит массив из 5 элементов, три из которых  - пустые: "", "один", "", "два", "";
//  СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(",один,,два,", ",", Истина)
//  - возвратит массив из двух элементов: "один", "два";
//  СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(" один   два  ", " ")
//  - возвратит массив из двух элементов: "один", "два";
//  СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("")
//  - возвратит пустой массив;
//  СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("",,Ложь)
//  - возвратит массив с одним элементом: ""(пустая строка);
//  СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("", " ")
//  - возвратит массив с одним элементом: "" (пустая строка).
//
Функция РазложитьСтрокуВМассивПодстрок(Знач Значение, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено,
	СокращатьНепечатаемыеСимволы = Ложь) Экспорт

	Результат = Новый Массив;
	
	// Для обеспечения обратной совместимости.
	Если ПропускатьПустыеСтроки = Неопределено Тогда
		ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь);
		Если ПустаяСтрока(Значение) Тогда
			Если Разделитель = " " Тогда
				Результат.Добавить("");
			КонецЕсли;
			Возврат Результат;
		КонецЕсли;
	КонецЕсли;
	//

	Позиция = СтрНайти(Значение, Разделитель);
	Пока Позиция > 0 Цикл
		Подстрока = Лев(Значение, Позиция - 1);
		Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда
			Если СокращатьНепечатаемыеСимволы Тогда
				Результат.Добавить(СокрЛП(Подстрока));
			Иначе
				Результат.Добавить(Подстрока);
			КонецЕсли;
		КонецЕсли;
		Значение = Сред(Значение, Позиция + СтрДлина(Разделитель));
		Позиция = СтрНайти(Значение, Разделитель);
	КонецЦикла;

	Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Значение) Тогда
		Если СокращатьНепечатаемыеСимволы Тогда
			Результат.Добавить(СокрЛП(Значение));
		Иначе
			Результат.Добавить(Значение);
		КонецЕсли;
	КонецЕсли;

	Возврат Результат;

КонецФункции 

// Определяет, является ли символ разделителем.
//
// Параметры:
//  КодСимвола      - Число  - код проверяемого символа;
//  РазделителиСлов - Строка - символы разделителей. Если параметр не указан, то 
//                             разделителем считаются все символы, не являющиеся цифрами, 
//                             латинскими и кириллическими буквами, а также знаком подчеркивания.
//
// Возвращаемое значение:
//  Булево - Истина, если символ с кодом КодСимвола является разделителем.
//
Функция ЭтоРазделительСлов(КодСимвола, РазделителиСлов = Неопределено) Экспорт

	Если РазделителиСлов <> Неопределено Тогда
		Возврат СтрНайти(РазделителиСлов, Символ(КодСимвола)) > 0;
	КонецЕсли;

	Диапазоны = Новый Массив;
	Диапазоны.Добавить(Новый Структура("Мин,Макс", 48, 57)); 		// цифры
	Диапазоны.Добавить(Новый Структура("Мин,Макс", 65, 90)); 		// латиница большие
	Диапазоны.Добавить(Новый Структура("Мин,Макс", 97, 122)); 		// латиница маленькие
	Диапазоны.Добавить(Новый Структура("Мин,Макс", 1040, 1103)); 	// кириллица
	Диапазоны.Добавить(Новый Структура("Мин,Макс", 1025, 1025)); 	// символ "Ё"
	Диапазоны.Добавить(Новый Структура("Мин,Макс", 1105, 1105)); 	// символ "ё"
	Диапазоны.Добавить(Новый Структура("Мин,Макс", 95, 95)); 		// символ "_"

	Для Каждого Диапазон Из Диапазоны Цикл
		Если КодСимвола >= Диапазон.Мин И КодСимвола <= Диапазон.Макс Тогда
			Возврат Ложь;
		КонецЕсли;
	КонецЦикла;

	Возврат Истина;

КонецФункции

// Разбивает строку на несколько строк, используя заданный набор разделителей.
// Если параметр РазделителиСлов не задан, то разделителем слов считается любой из символов, 
// не относящихся к символам латиницы, кириллицы, цифры, подчеркивания.
//
// Параметры:
//  Значение        - Строка - исходная строка, которую необходимо разложить на слова.
//  РазделителиСлов - Строка - перечень символов-разделителей. Например, ".,;".
//
// Возвращаемое значение:
//  Массив - список слов.
//
// Пример:
//  СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивСлов("один-@#два2_!три") возвратит массив значений: "один",
//  "два2_", "три"; СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивСлов("один-@#два2_!три", "#@!_") возвратит массив
//  значений: "один-", "два2", "три".
//
Функция РазложитьСтрокуВМассивСлов(Знач Значение, РазделителиСлов = Неопределено) Экспорт

	Слова = Новый Массив;

	РазмерТекста = СтрДлина(Значение);
	НачалоСлова = 1;
	Для Позиция = 1 По РазмерТекста Цикл
		КодСимвола = КодСимвола(Значение, Позиция);
		Если ЭтоРазделительСлов(КодСимвола, РазделителиСлов) Тогда
			Если Позиция <> НачалоСлова Тогда
				Слова.Добавить(Сред(Значение, НачалоСлова, Позиция - НачалоСлова));
			КонецЕсли;
			НачалоСлова = Позиция + 1;
		КонецЕсли;
	КонецЦикла;

	Если Позиция <> НачалоСлова Тогда
		Слова.Добавить(Сред(Значение, НачалоСлова, Позиция - НачалоСлова));
	КонецЕсли;

	Возврат Слова;

КонецФункции

// Подставляет параметры в строку. Максимально возможное число параметров - 9.
// Параметры в строке задаются как %<номер параметра>. Нумерация параметров начинается с единицы.
//
// Параметры:
//  ШаблонСтроки  - Строка - шаблон строки с параметрами (вхождениями вида "%<номер параметра>", 
//                           например, "%1 пошел в %2");
//  Параметр<n>   - Строка - значение подставляемого параметра.
//
// Возвращаемое значение:
//  Строка   - текстовая строка с подставленными параметрами.
//
// Пример:
//  СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='%1 пошел в %2'"), "Вася", "Зоопарк") = "Вася пошел
//  в Зоопарк".
//
Функция ПодставитьПараметрыВСтроку(Знач ШаблонСтроки, Знач Параметр1, Знач Параметр2 = Неопределено,
	Знач Параметр3 = Неопределено, Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено,
	Знач Параметр6 = Неопределено, Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено,
	Знач Параметр9 = Неопределено) Экспорт

	ЕстьПараметрыСПроцентом = СтрНайти(Параметр1, "%") Или СтрНайти(Параметр2, "%") Или СтрНайти(Параметр3, "%")
		Или СтрНайти(Параметр4, "%") Или СтрНайти(Параметр5, "%") Или СтрНайти(Параметр6, "%") Или СтрНайти(Параметр7,
		"%") Или СтрНайти(Параметр8, "%") Или СтрНайти(Параметр9, "%");

	Если ЕстьПараметрыСПроцентом Тогда
		Возврат ПодставитьПараметрыСПроцентом(ШаблонСтроки, Параметр1, Параметр2, Параметр3, Параметр4, Параметр5,
			Параметр6, Параметр7, Параметр8, Параметр9);
	КонецЕсли;

	ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%1", Параметр1);
	ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%2", Параметр2);
	ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%3", Параметр3);
	ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%4", Параметр4);
	ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%5", Параметр5);
	ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%6", Параметр6);
	ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%7", Параметр7);
	ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%8", Параметр8);
	ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%9", Параметр9);
	Возврат ШаблонСтроки;

КонецФункции

// Подставляет параметры в строку. Число параметров в строке не ограничено.
// Параметры в строке задаются как %<номер параметра>. Нумерация параметров
// начинается с единицы.
//
// Параметры:
//  ШаблонСтроки  - Строка - шаблон строки с параметрами (вхождениями вида "%<номер параметра>", 
//                           например, "%1 пошел в %2");
//  Параметры     - Массив - значения параметров в строке ШаблонСтроки.
//
// Возвращаемое значение:
//   Строка - строка с подставленными значениями параметрами.
//
// Пример:
//  ЗначенияПараметров = Новый Массив;
//  ЗначенияПараметров.Добавить("Вася");
//  ЗначенияПараметров.Добавить("Зоопарк");
//  Результат = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='%1 пошел в %2'"), ЗначенияПараметров);
//  - вернет строку "Вася пошел в Зоопарк".
//
Функция ПодставитьПараметрыВСтрокуИзМассива(Знач ШаблонСтроки, Знач Параметры) Экспорт

	СтрокаРезультата = ШаблонСтроки;

	Индекс = Параметры.Количество();
	Пока Индекс > 0 Цикл
		Значение = Параметры[Индекс - 1];
		Если Не ПустаяСтрока(Значение) Тогда
			СтрокаРезультата = СтрЗаменить(СтрокаРезультата, "%" + Формат(Индекс, "ЧГ="), Значение);
		КонецЕсли;
		Индекс = Индекс - 1;
	КонецЦикла;

	Возврат СтрокаРезультата;

КонецФункции

// Заменяет в шаблоне строки имена параметров на их значения. Параметры в строке выделяются с двух сторон квадратными
// скобками.
//
// Параметры:
//  ШаблонСтроки - Строка    - строка, в которую необходимо вставить значения.
//  Параметры    - Структура - подставляемые значения параметров, где ключ - имя параметра без спецсимволов,
//                             значение - вставляемое значение.
//
// Возвращаемое значение:
//  Строка - строка со вставленными значениями.
//
// Пример:
//  Значения = Новый Структура("Фамилия,Имя", "Пупкин", "Вася");
//  Результат = СтроковыеФункцииКлиентСервер.ВставитьПараметрыВСтроку("Здравствуй, [Имя] [Фамилия].", Значения);
//  - возвращает: "Здравствуй, Вася Пупкин".
//
Функция ВставитьПараметрыВСтроку(Знач ШаблонСтроки, Знач Параметры) Экспорт
	Результат = ШаблонСтроки;
	Для Каждого Параметр Из Параметры Цикл
		Результат = СтрЗаменить(Результат, "[" + Параметр.Ключ + "]", Параметр.Значение);
	КонецЦикла;
	Возврат Результат;
КонецФункции

// Получает значения параметров из строки.
//
// Параметры:
//  СтрокаПараметров - Строка - строка, содержащая параметры, каждый из которых представляет собой
//                              фрагмент вида <Имя параметра>=<Значение>, где:
//                                Имя параметра - имя параметра; 
//                                Значение - его значение. 
//                              Фрагменты отделяются друг от друга символами ';'.
//                              Если значение содержит пробельные символы, то оно должно быть заключено в двойные
//                              кавычки (").
//                              Например:
//                               "File=""c:\InfoBases\Trade""; Usr=""Director"";"
//  Разделитель - Строка - символ, которым фрагменты отделяются друг от друга.
//
// Возвращаемое значение:
//  Структура - значения параметров, где ключ - имя параметра, значение - значение параметра.
//
// Пример:
//  Результат = СтроковыеФункцииКлиентСервер.ПараметрыИзСтроки("File=""c:\InfoBases\Trade""; Usr=""Director"";""", ";");
//  - вернет структуру:
//     ключ "File" и значение "c:\InfoBases\Trade"
//     ключ "Usr"  и значение "Director".
//
Функция ПараметрыИзСтроки(Знач СтрокаПараметров, Знач Разделитель = ";") Экспорт
	Результат = Новый Структура;

	ОписаниеПараметра = "";
	НайденоНачалоСтроки = Ложь;
	НомерПоследнегоСимвола = СтрДлина(СтрокаПараметров);
	Для НомерСимвола = 1 По НомерПоследнегоСимвола Цикл
		Символ =Сред(СтрокаПараметров, НомерСимвола, 1);
		Если Символ = """" Тогда
			НайденоНачалоСтроки = Не НайденоНачалоСтроки;
		КонецЕсли;
		Если Символ <> Разделитель Или НайденоНачалоСтроки Тогда
			ОписаниеПараметра = ОписаниеПараметра + Символ;
		КонецЕсли;
		Если Символ = Разделитель И Не НайденоНачалоСтроки Или НомерСимвола = НомерПоследнегоСимвола Тогда
			Позиция = СтрНайти(ОписаниеПараметра, "=");
			Если Позиция > 0 Тогда
				ИмяПараметра = СокрЛП(Лев(ОписаниеПараметра, Позиция - 1));
				ЗначениеПараметра = СокрЛП(Сред(ОписаниеПараметра, Позиция + 1));
				ЗначениеПараметра = СократитьДвойныеКавычки(ЗначениеПараметра);
				Результат.Вставить(ИмяПараметра, ЗначениеПараметра);
			КонецЕсли;
			ОписаниеПараметра = "";
		КонецЕсли;
	КонецЦикла;

	Возврат Результат;
КонецФункции

// Проверяет, содержит ли строка только цифры.
//
// Параметры:
//  Значение         - Строка - проверяемая строка.
//  Устаревший       - Булево - устаревший параметр, не используется.
//  ПробелыЗапрещены - Булево - если Ложь, то в строке допустимо наличие пробелов.
//
// Возвращаемое значение:
//   Булево - Истина - строка содержит только цифры или пустая, Ложь - строка содержит иные символы.
//
// Пример:
//  Результат = СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке("0123"); // Истина
//  Результат = СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке("0123abc"); // Ложь
//  Результат = СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке("01 2 3",, Ложь); // Истина
//
Функция ТолькоЦифрыВСтроке(Знач Значение, Знач Устаревший = Истина, Знач ПробелыЗапрещены = Истина) Экспорт

	Если ТипЗнч(Значение) <> Тип("Строка") Тогда
		Возврат Ложь;
	КонецЕсли;

	Если Не ПробелыЗапрещены Тогда
		Значение = СтрЗаменить(Значение, " ", "");
	КонецЕсли;

	Если СтрДлина(Значение) = 0 Тогда
		Возврат Истина;
	КонецЕсли;
	
	// Если содержит только цифры, то в результате замен должна быть получена пустая строка.
	// Проверять при помощи ПустаяСтрока нельзя, так как в исходной строке могут быть пробельные символы.
	Возврат СтрДлина(
		СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить(
		СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( 
			Значение, "0", ""), "1", ""), "2", ""), "3", ""), "4", ""), "5", ""), "6", ""), "7", ""), "8", ""), "9",
		"")) = 0;

КонецФункции

// Проверяет, содержит ли строка только символы кириллического алфавита.
//
// Параметры:
//  СтрокаПроверки - Строка - проверяемая строка.
//  УчитыватьРазделителиСлов - Булево - учитывать ли разделители слов или они являются исключением.
//  ДопустимыеСимволы - Строка - дополнительные разрешенные символы, кроме кириллицы.
//
// Возвращаемое значение:
//  Булево - Истина, если строка содержит только кириллические (или допустимые) символы или пустая;
//           Ложь, если строка содержит иные символы.
//
Функция ТолькоКириллицаВСтроке(Знач СтрокаПроверки, Знач УчитыватьРазделителиСлов = Истина, ДопустимыеСимволы = "") Экспорт

	Если ТипЗнч(СтрокаПроверки) <> Тип("Строка") Тогда
		Возврат Ложь;
	КонецЕсли;

	Если Не ЗначениеЗаполнено(СтрокаПроверки) Тогда
		Возврат Истина;
	КонецЕсли;

	КодыДопустимыхСимволов = Новый Массив;
	КодыДопустимыхСимволов.Добавить(1105); // "ё"
	КодыДопустимыхСимволов.Добавить(1025); // "Ё"

	Для Индекс = 1 По СтрДлина(ДопустимыеСимволы) Цикл
		КодыДопустимыхСимволов.Добавить(КодСимвола(Сред(ДопустимыеСимволы, Индекс, 1)));
	КонецЦикла;

	Для Индекс = 1 По СтрДлина(СтрокаПроверки) Цикл
		КодСимвола = КодСимвола(Сред(СтрокаПроверки, Индекс, 1));
		Если ((КодСимвола < 1040) Или (КодСимвола > 1103)) И (КодыДопустимыхСимволов.Найти(КодСимвола) = Неопределено)
			И Не (Не УчитыватьРазделителиСлов И ЭтоРазделительСлов(КодСимвола)) Тогда
			Возврат Ложь;
		КонецЕсли;
	КонецЦикла;

	Возврат Истина;

КонецФункции

// Проверяет, содержит ли строка только символы латинского алфавита.
//
// Параметры:
//  СтрокаПроверки - Строка - проверяемая строка.
//  УчитыватьРазделителиСлов - Булево - учитывать ли разделители слов или они являются исключением.
//  ДопустимыеСимволы - Строка - дополнительные разрешенные символы, кроме латиницы.
//
// Возвращаемое значение:
//  Булево - Истина, если строка содержит только латинские (или допустимые) символы;
//         - Ложь, если строка содержит иные символы.
//
Функция ТолькоЛатиницаВСтроке(Знач СтрокаПроверки, Знач УчитыватьРазделителиСлов = Истина, ДопустимыеСимволы = "") Экспорт

	Если ТипЗнч(СтрокаПроверки) <> Тип("Строка") Тогда
		Возврат Ложь;
	КонецЕсли;

	Если Не ЗначениеЗаполнено(СтрокаПроверки) Тогда
		Возврат Истина;
	КонецЕсли;

	КодыДопустимыхСимволов = Новый Массив;

	Для Индекс = 1 По СтрДлина(ДопустимыеСимволы) Цикл
		КодыДопустимыхСимволов.Добавить(КодСимвола(Сред(ДопустимыеСимволы, Индекс, 1)));
	КонецЦикла;

	Для Индекс = 1 По СтрДлина(СтрокаПроверки) Цикл
		КодСимвола = КодСимвола(Сред(СтрокаПроверки, Индекс, 1));
		Если ((КодСимвола < 65) Или (КодСимвола > 90 И КодСимвола < 97) Или (КодСимвола > 122))
			И (КодыДопустимыхСимволов.Найти(КодСимвола) = Неопределено) И Не (Не УчитыватьРазделителиСлов
			И ЭтоРазделительСлов(КодСимвола)) Тогда
			Возврат Ложь;
		КонецЕсли;
	КонецЦикла;

	Возврат Истина;

КонецФункции

// Удаляет двойные кавычки с начала и конца строки, если они есть.
//
// Параметры:
//  Значение - Строка - входная строка.
//
// Возвращаемое значение:
//  Строка - строка без двойных кавычек.
// 
Функция СократитьДвойныеКавычки(Знач Значение) Экспорт

	Пока СтрНачинаетсяС(Значение, """") Цикл
		Значение = Сред(Значение, 2);
	КонецЦикла;

	Пока СтрЗаканчиваетсяНа(Значение, """") Цикл
		Значение = Лев(Значение, СтрДлина(Значение) - 1);
	КонецЦикла;

	Возврат Значение;

КонецФункции 

// Удаляет из строки указанное количество символов справа.
//
// Параметры:
//  Текст         - Строка - строка, в которой необходимо удалить последние символы;
//  ЧислоСимволов - Число  - количество удаляемых символов.
//
Процедура УдалитьПоследнийСимволВСтроке(Текст, ЧислоСимволов = 1) Экспорт

	Текст = Лев(Текст, СтрДлина(Текст) - ЧислоСимволов);

КонецПроцедуры 

// Проверяет, является ли строка уникальным идентификатором.
// В качестве уникального идентификатора предполагается строка вида
// "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", где X = [0..9,a..f].
//
// Параметры:
//  Значение - Строка - проверяемая строка.
//
// Возвращаемое значение:
//  Булево - Истина, если переданная строка является уникальным идентификатором.
//
Функция ЭтоУникальныйИдентификатор(Знач Значение) Экспорт

	Шаблон = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX";

	Если СтрДлина(Шаблон) <> СтрДлина(Значение) Тогда
		Возврат Ложь;
	КонецЕсли;
	Для Позиция = 1 По СтрДлина(Значение) Цикл
		Если КодСимвола(Шаблон, Позиция) = 88 // X

			И ((КодСимвола(Значение, Позиция) < 48 Или КодСимвола(Значение, Позиция) > 57) // 0..9

			И (КодСимвола(Значение, Позиция) < 97 Или КодСимвола(Значение, Позиция) > 102) // a..f

			И (КодСимвола(Значение, Позиция) < 65 Или КодСимвола(Значение, Позиция) > 70)) // A..F

			Или КодСимвола(Шаблон, Позиция) = 45 И КодСимвола(Значение, Позиция) <> 45 Тогда // -
			Возврат Ложь;
		КонецЕсли;
	КонецЦикла;

	Возврат Истина;

КонецФункции

// Формирует строку повторяющихся символов заданной длины.
//
// Параметры:
//  Символ      - Строка - символ, из которого будет формироваться строка.
//  ДлинаСтроки - Число  - требуемая длина результирующей строки.
//
// Возвращаемое значение:
//  Строка - строка, состоящая из повторяющихся символов.
//
Функция СформироватьСтрокуСимволов(Знач Символ, Знач ДлинаСтроки) Экспорт

	Результат = "";
	Для Счетчик = 1 По ДлинаСтроки Цикл
		Результат = Результат + Символ;
	КонецЦикла;

	Возврат Результат;

КонецФункции

// Дополняет строку символами слева или справа до заданной длины и возвращает ее.
// При этом удаляются незначащие символы слева и справа (подробнее про незначащие символы 
// см. синтаксис-помощник к методу платформы СокрЛП). 
// По умолчанию функция дополняет строку символами "0" (ноль) слева.
//
// Параметры:
//  Значение    - Строка - исходная строка, которую необходимо дополнить символами;
//  ДлинаСтроки - Число  - требуемая результирующая длина строки;
//  Символ      - Строка - символ, которым необходимо дополнить строку;
//  Режим       - Строка - "Слева" или "Справа" - вариант добавления символов к исходной строке.
// 
// Возвращаемое значение:
//  Строка - строка, дополненная символами.
//
// Пример:
//  1. Результат = СтроковыеФункцииКлиентСервер.ДополнитьСтроку("1234", 10, "0", "Слева");
//  Возвращает: "0000001234".
//
//  2. Результат = СтроковыеФункцииКлиентСервер.ДополнитьСтроку(" 1234  ", 10, "#", "Справа");
//  Строка = " 1234  "; ДлинаСтроки = 10; Символ = "#"; Режим = "Справа"
//  Возвращает: "1234######".
//
Функция ДополнитьСтроку(Знач Значение, Знач ДлинаСтроки, Знач Символ = "0", Знач Режим = "Слева") Экспорт
	
	// Длина символа не должна превышать единицы.
	Символ = Лев(Символ, 1);
	
	// Удаляем крайние пробелы слева и справа строки.
	Значение = СокрЛП(Значение);
	КоличествоСимволовНадоДобавить = ДлинаСтроки - СтрДлина(Значение);

	Если КоличествоСимволовНадоДобавить > 0 Тогда

		СтрокаДляДобавления = СформироватьСтрокуСимволов(Символ, КоличествоСимволовНадоДобавить);
		Если ВРег(Режим) = "СЛЕВА" Тогда
			Значение = СтрокаДляДобавления + Значение;
		ИначеЕсли ВРег(Режим) = "СПРАВА" Тогда
			Значение = Значение + СтрокаДляДобавления;
		КонецЕсли;

	КонецЕсли;

	Возврат Значение;

КонецФункции

// Удаляет крайние повторяющиеся символы слева или справа в строке.
//
// Параметры:
//  Значение        - Строка - исходная строка, из которой необходимо удалить крайние повторяющиеся символы;
//  УдаляемыйСимвол - Строка - искомый символ для удаления;
//  Режим           - Строка - "Слева" или "Справа" - режим удаления символов в исходной строке.
//
// Возвращаемое значение:
//  Строка - обрезанная строка.
//
Функция УдалитьПовторяющиесяСимволы(Знач Значение, Знач УдаляемыйСимвол, Знач Режим = "Слева") Экспорт

	Если ВРег(Режим) = "СЛЕВА" Тогда
		Пока Лев(Значение, 1) = УдаляемыйСимвол Цикл
			Значение = Сред(Значение, 2);
		КонецЦикла;
	ИначеЕсли ВРег(Режим) = "СПРАВА" Тогда
		Пока Прав(Значение, 1) = УдаляемыйСимвол Цикл
			Значение = Лев(Значение, СтрДлина(Значение) - 1);
		КонецЦикла;
	КонецЕсли;

	Возврат Значение;

КонецФункции

// Выполняет замену символов в строке.
// Предназначена для простых случаев, например, для замены латиницы на похожие кириллические символы.
//
// Параметры:
//  ЗаменяемыеСимволы - Строка - строка символов, каждый из которых требует замены;
//  Значение          - Строка - исходная строка, в которой требуется замена символов;
//  СимволыЗамены     - Строка - строка символов, на каждый из которых нужно заменить символы параметра
//                               ЗаменяемыеСимволы.
// 
// Возвращаемое значение:
//  Строка - строка после замены символов.
//
Функция ЗаменитьОдниСимволыДругими(ЗаменяемыеСимволы, Значение, СимволыЗамены) Экспорт

	Результат = Значение;

	Для НомерСимвола = 1 По СтрДлина(ЗаменяемыеСимволы) Цикл
		Результат = СтрЗаменить(Результат, Сред(ЗаменяемыеСимволы, НомерСимвола, 1), Сред(СимволыЗамены, НомерСимвола,
			1));
	КонецЦикла;

	Возврат Результат;

КонецФункции

// Выполняет преобразование арабского числа в римское.
//
// Параметры:
//  АрабскоеЧисло - Число - число, целое, от 0 до 999;
//  ИспользоватьКириллицу - Булево - использовать в качестве арабских цифр кириллицу или латиницу.
//
// Возвращаемое значение:
//  Строка - число в римской нотации.
//
// Пример:
//  СтроковыеФункцииКлиентСервер.ПреобразоватьЧислоВРимскуюНотацию(17) = "ХVII".
//
Функция ПреобразоватьЧислоВРимскуюНотацию(АрабскоеЧисло, ИспользоватьКириллицу = Истина) Экспорт

	РимскоеЧисло	= "";
	АрабскоеЧисло	= ДополнитьСтроку(АрабскоеЧисло, 3);

	Если ИспользоватьКириллицу Тогда
		c1 = "1";
		c5 = "У";
		c10 = "Х";
		c50 = "Л";
		c100 ="С";
		c500 = "Д";
		c1000 = "М";

	Иначе
		c1 = "I";
		c5 = "V";
		c10 = "X";
		c50 = "L";
		c100 ="C";
		c500 = "D";
		c1000 = "M";

	КонецЕсли;

	Единицы	= Число(Сред(АрабскоеЧисло, 3, 1));
	Десятки	= Число(Сред(АрабскоеЧисло, 2, 1));
	Сотни	= Число(Сред(АрабскоеЧисло, 1, 1));

	РимскоеЧисло = РимскоеЧисло + ПреобразоватьЦифруВРимскуюНотацию(Сотни, c100, c500, c1000);
	РимскоеЧисло = РимскоеЧисло + ПреобразоватьЦифруВРимскуюНотацию(Десятки, c10, c50, c100);
	РимскоеЧисло = РимскоеЧисло + ПреобразоватьЦифруВРимскуюНотацию(Единицы, c1, c5, c10);

	Возврат РимскоеЧисло;

КонецФункции 

// Выполняет преобразование римского числа в арабское.
//
// Параметры:
//  РимскоеЧисло - Строка - число, записанное римскими цифрами;
//  ИспользоватьКириллицу - Булево - использовать в качестве арабских цифр кириллицу или латиницу.
//
// Возвращаемое значение:
//  Число - преобразованное число.
//
// Пример:
//  СтроковыеФункцииКлиентСервер.ПреобразоватьЧислоВАрабскуюНотацию("ХVII") = 17.
//
Функция ПреобразоватьЧислоВАрабскуюНотацию(РимскоеЧисло, ИспользоватьКириллицу = Истина) Экспорт

	АрабскоеЧисло = 0;

	Если ИспользоватьКириллицу Тогда
		c1 = "1";
		c5 = "У";
		c10 = "Х";
		c50 = "Л";
		c100 ="С";
		c500 = "Д";
		c1000 = "М";
	Иначе
		c1 = "I";
		c5 = "V";
		c10 = "X";
		c50 = "L";
		c100 ="C";
		c500 = "D";
		c1000 = "M";
	КонецЕсли;

	РимскоеЧисло = СокрЛП(РимскоеЧисло);
	ЧислоСимволов = СтрДлина(РимскоеЧисло);

	Для Сч = 1 По ЧислоСимволов Цикл
		Если Сред(РимскоеЧисло, Сч, 1) = c1000 Тогда
			АрабскоеЧисло = АрабскоеЧисло + 1000;
		ИначеЕсли Сред(РимскоеЧисло, Сч, 1) = c500 Тогда
			АрабскоеЧисло = АрабскоеЧисло + 500;
		ИначеЕсли Сред(РимскоеЧисло, Сч, 1) = c100 Тогда
			Если (Сч < ЧислоСимволов) И ((Сред(РимскоеЧисло, Сч + 1, 1) = c500) Или (Сред(РимскоеЧисло, Сч + 1, 1)
				= c1000)) Тогда
				АрабскоеЧисло = АрабскоеЧисло - 100;
			Иначе
				АрабскоеЧисло = АрабскоеЧисло + 100;
			КонецЕсли;
		ИначеЕсли Сред(РимскоеЧисло, Сч, 1) = c50 Тогда
			АрабскоеЧисло = АрабскоеЧисло + 50;
		ИначеЕсли Сред(РимскоеЧисло, Сч, 1) = c10 Тогда
			Если (Сч < ЧислоСимволов) И ((Сред(РимскоеЧисло, Сч + 1, 1) = c50) Или (Сред(РимскоеЧисло, Сч + 1, 1)
				= c100)) Тогда
				АрабскоеЧисло = АрабскоеЧисло - 10;
			Иначе
				АрабскоеЧисло = АрабскоеЧисло + 10;
			КонецЕсли;
		ИначеЕсли Сред(РимскоеЧисло, Сч, 1) = c5 Тогда
			АрабскоеЧисло = АрабскоеЧисло + 5;
		ИначеЕсли Сред(РимскоеЧисло, Сч, 1) = c1 Тогда
			Если (Сч < ЧислоСимволов) И ((Сред(РимскоеЧисло, Сч + 1, 1) = c5) Или (Сред(РимскоеЧисло, Сч + 1, 1)
				= c10)) Тогда
				АрабскоеЧисло = АрабскоеЧисло - 1;
			Иначе
				АрабскоеЧисло = АрабскоеЧисло + 1;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;

	Возврат АрабскоеЧисло;

КонецФункции 

// Очищает текст в формате HTML от тегов и возвращает неформатированный текст. 
//
// Параметры:
//  ИсходныйТекст - Строка - текст в формате HTML.
//
// Возвращаемое значение:
//  Строка - текст, очищенный от тегов, скриптов и заголовков.
//
Функция ИзвлечьТекстИзHTML(Знач ИсходныйТекст) Экспорт
	Результат = "";

	Текст = НРег(ИсходныйТекст);
	
	// отрезаем все что не body
	Позиция = СтрНайти(Текст, "<body");
	Если Позиция > 0 Тогда
		Текст = Сред(Текст, Позиция + 5);
		ИсходныйТекст = Сред(ИсходныйТекст, Позиция + 5);
		Позиция = СтрНайти(Текст, ">");
		Если Позиция > 0 Тогда
			Текст = Сред(Текст, Позиция + 1);
			ИсходныйТекст = Сред(ИсходныйТекст, Позиция + 1);
		КонецЕсли;
	КонецЕсли;

	Позиция = СтрНайти(Текст, "</body>");
	Если Позиция > 0 Тогда
		Текст = Лев(Текст, Позиция - 1);
		ИсходныйТекст = Лев(ИсходныйТекст, Позиция - 1);
	КонецЕсли;
	
	// вырезаем скрипты
	Позиция = СтрНайти(Текст, "<script");
	Пока Позиция > 0 Цикл
		ПозицияЗакрывающегоТега = СтрНайти(Текст, "</script>");
		Если ПозицияЗакрывающегоТега = 0 Тогда
			// Не найден закрывающий тег - вырезаем оставшийся текст.
			ПозицияЗакрывающегоТега = СтрДлина(Текст);
		КонецЕсли;
		Текст = Лев(Текст, Позиция - 1) + Сред(Текст, ПозицияЗакрывающегоТега + 9);
		ИсходныйТекст = Лев(ИсходныйТекст, Позиция - 1) + Сред(ИсходныйТекст, ПозицияЗакрывающегоТега + 9);
		Позиция = СтрНайти(Текст, "<script");
	КонецЦикла;
	
	// вырезаем стили
	Позиция = СтрНайти(Текст, "<style");
	Пока Позиция > 0 Цикл
		ПозицияЗакрывающегоТега = СтрНайти(Текст, "</style>");
		Если ПозицияЗакрывающегоТега = 0 Тогда
			// Не найден закрывающий тег - вырезаем оставшийся текст.
			ПозицияЗакрывающегоТега = СтрДлина(Текст);
		КонецЕсли;
		Текст = Лев(Текст, Позиция - 1) + Сред(Текст, ПозицияЗакрывающегоТега + 8);
		ИсходныйТекст = Лев(ИсходныйТекст, Позиция - 1) + Сред(ИсходныйТекст, ПозицияЗакрывающегоТега + 8);
		Позиция = СтрНайти(Текст, "<style");
	КонецЦикла;
	
	// вырезаем все теги	
	Позиция = СтрНайти(Текст, "<");
	Пока Позиция > 0 Цикл
		Результат = Результат + Лев(ИсходныйТекст, Позиция - 1);
		Текст = Сред(Текст, Позиция + 1);
		ИсходныйТекст = Сред(ИсходныйТекст, Позиция + 1);
		Позиция = СтрНайти(Текст, ">");
		Если Позиция > 0 Тогда
			Текст = Сред(Текст, Позиция + 1);
			ИсходныйТекст = Сред(ИсходныйТекст, Позиция + 1);
		КонецЕсли;
		Позиция = СтрНайти(Текст, "<");
	КонецЦикла;
	Результат = Результат + ИсходныйТекст;
	МассивСтрок = РазложитьСтрокуВМассивПодстрок(Результат, Символы.ПС, Истина, Истина);
	Возврат СокрЛП(СтрСоединить(МассивСтрок, Символы.ПС));
КонецФункции

// Преобразует исходную строку в транслит.
// Может использоваться для отправки SMS сообщений латиницей или для сохранения
// файлов и папок, чтобы обеспечить возможность их переноса между разными операционными системами.
// Обратное преобразование из латинских символов не предусмотрено.
//
// Параметры:
//  Значение - Строка - произвольная строка.
//
// Возвращаемое значение:
//  Строка - строка, в которой кириллица заменена на транслит.
//
Функция СтрокаЛатиницей(Знач Значение) Экспорт
	Результат = "";

	Соответствие = СоответствиеНациональногоАлфавитаИЛатиницы();

	Для Позиция = 1 По СтрДлина(Значение) Цикл
		Символ = Сред(Значение, Позиция, 1);
		СимволЛатиницей = Соответствие[НРег(Символ)]; // Поиск соответствия без учета регистра.
		Если СимволЛатиницей = Неопределено Тогда
			// Другие символы остаются "как есть".
			СимволЛатиницей = Символ;
		Иначе
			Если Символ = ВРег(Символ) Тогда
				СимволЛатиницей = ТРег(СимволЛатиницей); // восстанавливаем регистр
			КонецЕсли;
		КонецЕсли;
		Результат = Результат + СимволЛатиницей;
	КонецЦикла;

	Возврат Результат;
КонецФункции

// Форматирует строку в соответствии с заданным шаблоном.
// Возможные значения тегов в шаблоне:
// - <b> Строка </b> - выделяет строку жирным шрифтом.
// - <a href = "Ссылка"> Строка </a> - добавляет гиперссылку.
// Например, "Минимальная версия программы <b>1.1</b>. <a href = "Обновление">Обновите</a> программу.".
//
// Параметры:
//  СтрокаСТегами - Строка - строка, содержащая теги форматирования.
//
// Возвращаемое значение:
//  ФорматированнаяСтрока - преобразованная строка.
//
Функция ФорматированнаяСтрока(Знач СтрокаСТегами) Экспорт

	СтрокиСВыделением = Новый СписокЗначений;
	Пока СтрНайти(СтрокаСТегами, "<b>") <> 0 Цикл
		НачалоВыделения = СтрНайти(СтрокаСТегами, "<b>");
		СтрокаДоОткрывающегоТега = Лев(СтрокаСТегами, НачалоВыделения - 1);
		СтрокиСВыделением.Добавить(СтрокаДоОткрывающегоТега);
		СтрокаПослеОткрывающегоТега = Сред(СтрокаСТегами, НачалоВыделения + 3);
		КонецВыделения = СтрНайти(СтрокаПослеОткрывающегоТега, "</b>");
		ВыделенныйФрагмент = Лев(СтрокаПослеОткрывающегоТега, КонецВыделения - 1);
		СтрокиСВыделением.Добавить(ВыделенныйФрагмент, , Истина);
		СтрокаПослеВыделения = Сред(СтрокаПослеОткрывающегоТега, КонецВыделения + 4);
		СтрокаСТегами = СтрокаПослеВыделения;
	КонецЦикла;
	СтрокиСВыделением.Добавить(СтрокаСТегами);

	СтрокиСоСсылками = Новый СписокЗначений;
	Для Каждого ЧастьСтроки Из СтрокиСВыделением Цикл

		СтрокаСТегами = ЧастьСтроки.Значение;

		Если ЧастьСтроки.Пометка Тогда
			СтрокиСоСсылками.Добавить(СтрокаСТегами, , Истина);
			Продолжить;
		КонецЕсли;

		НачалоВыделения = СтрНайти(СтрокаСТегами, "<a href = ");
		Пока НачалоВыделения <> 0 Цикл
			СтрокаДоОткрывающегоТега = Лев(СтрокаСТегами, НачалоВыделения - 1);
			СтрокиСоСсылками.Добавить(СтрокаДоОткрывающегоТега, );

			СтрокаПослеОткрывающегоТега = Сред(СтрокаСТегами, НачалоВыделения + 9);
			ЗакрывающийТег = СтрНайти(СтрокаПослеОткрывающегоТега, ">");

			Ссылка = СокрЛП(Лев(СтрокаПослеОткрывающегоТега, ЗакрывающийТег - 2));
			Если СтрНачинаетсяС(Ссылка, """") Тогда
				Ссылка = Сред(Ссылка, 2, СтрДлина(Ссылка) - 1);
			КонецЕсли;
			Если СтрЗаканчиваетсяНа(Ссылка, """") Тогда
				Ссылка = Сред(Ссылка, 1, СтрДлина(Ссылка) - 1);
			КонецЕсли;

			СтрокаПослеСсылки = Сред(СтрокаПослеОткрывающегоТега, ЗакрывающийТег + 1);
			КонецВыделения = СтрНайти(СтрокаПослеСсылки, "</a>");
			ТекстСсылки = Лев(СтрокаПослеСсылки, КонецВыделения - 1);
			СтрокиСоСсылками.Добавить(ТекстСсылки, Ссылка);

			СтрокаПослеВыделения = Сред(СтрокаПослеСсылки, КонецВыделения + 4);
			СтрокаСТегами = СтрокаПослеВыделения;

			НачалоВыделения = СтрНайти(СтрокаСТегами, "<a href = ");
		КонецЦикла;
		СтрокиСоСсылками.Добавить(СтрокаСТегами);

	КонецЦикла;

	МассивСтроки = Новый Массив;
	Для Каждого ЧастьСтроки Из СтрокиСоСсылками Цикл

		Если ЧастьСтроки.Пометка Тогда
			МассивСтроки.Добавить(Новый ФорматированнаяСтрока(ЧастьСтроки.Значение, Новый Шрифт(, , Истина)));
		ИначеЕсли Не ПустаяСтрока(ЧастьСтроки.Представление) Тогда
			МассивСтроки.Добавить(Новый ФорматированнаяСтрока(ЧастьСтроки.Значение, , , , ЧастьСтроки.Представление));
		Иначе
			МассивСтроки.Добавить(ЧастьСтроки.Значение);
		КонецЕсли;

	КонецЦикла;

	Возврат Новый ФорматированнаяСтрока(МассивСтроки);

КонецФункции

// Преобразует исходную строку в число без вызова исключений.
//
// Параметры:
//   Значение - Строка - Строка, которую необходимо привести к числу.
//                       Например, "10", "+10", "010", вернет 10;
//                                 "(10)", "-10",вернет -10;
//                                 "10,2", "10.2",вернет 10.2;
//                                 "000", " ", "",вернет 0;
//                                 "10текст", вернет Неопределено.
//
// Возвращаемое значение:
//   Число, Неопределено - Полученное число, либо Неопределено, если строка не является числом.
//
Функция СтрокаВЧисло(Знач Значение) Экспорт

	Значение  = СтрЗаменить(Значение, " ", "");
	Если СтрНачинаетсяС(Значение, "(") Тогда
		Значение = СтрЗаменить(Значение, "(", "-");
		Значение = СтрЗаменить(Значение, ")", "");
	КонецЕсли;

	СтрокаБезНулей = СтрЗаменить(Значение, "0", "");
	Если ПустаяСтрока(СтрокаБезНулей) Или СтрокаБезНулей = "-" Тогда
		Возврат 0;
	КонецЕсли;

	ТипЧисло  = Новый ОписаниеТипов("Число");
	Результат = ТипЧисло.ПривестиЗначение(Значение);

	Возврат ?(Результат <> 0 И Не ПустаяСтрока(СтрокаБезНулей), Результат, Неопределено);

КонецФункции

// Преобразует исходную строку в дату.
//
// Параметры:
//  Значение - Строка - Строка, которую необходимо привести к дате.
//                      Формат даты должен быть в виде "ДД.ММ.ГГГГ" или "ДД/ММ/ГГ",
//                      Например, "23.02.1980" или "23/02/80".
// 
// Возвращаемое значение:
//  Дата - полученная дата.
//
Функция СтрокаВДату(Знач Значение) Экспорт

	ПозицияПробела = СтрНайти(Значение, " ", НаправлениеПоиска.СНачала);
	Если ПозицияПробела > 0 Тогда
		Значение = Лев(Значение, ПозицияПробела - 1);
	КонецЕсли;
	Значение = СтрЗаменить(Значение, " ", "");
	Значение = СокрЛП(СтрЗаменить(Значение, ".", ""));
	Значение = СокрЛП(СтрЗаменить(Значение, "/", ""));
	Значение = СокрЛП(СтрЗаменить(Значение, "-", ""));
	Значение = Сред(Значение, 5) + Сред(Значение, 3, 2) + Лев(Значение, 2);
	Если СтрДлина(Значение) = 6 Тогда
		Год = СтрокаВЧисло(Лев(Значение, 2));
		Значение = ?(Год > 29, "19", "20") + Значение;
	КонецЕсли;

	ОписаниеТипа = Новый ОписаниеТипов("Дата");
	Результат    = ОписаниеТипа.ПривестиЗначение(Значение);

	Возврат Результат;

КонецФункции 

// Формирует представление числа для определенного языка и параметров числа.
//
// Параметры:
//  Шаблон          - Строка - Строка, содержит перечисленные через точку с запятой 6 форм строки
//                             для каждой категории числительного: 
//                             - %1 обозначает позицию числа;
//  Число           - Число - Число, которое будет подставлено в строку вместо параметра "%1".
//  Вид             - ВидЧисловогоЗначения - Определяет вид числового значения, для которого формируется представление. 
//                             - Количественное (по умолчанию) или Порядковое.
//  ФорматнаяСтрока - Строка - Строка параметров форматирования. См. аналогичный параметр в СтрокаСЧислом. 
//
// Возвращаемое значение:
//  Строка - Представление строки числа в требуемой форме.
//
// Пример:
//
//  // Представление параметров:
//  //
//  // Lang | Zero | One             | Two            | Few               | Many                  | Other
//  // ============================================================================================================
//  // ru   |      | XX1 / X11       |                | XX2-XX4 / X12-X14 | XX0, XX5-XX9, X11-X14 | дробные
//  // Card.|      | остался %1 день |                | осталось %1 дня   | осталось %1 дней      | осталось %1 дня
//  //      |      | вижу %1 рыбу    |                | вижу %1-х рыб     | вижу %5 рыб           | вижу %1 рыбы
//  // ------------------------------------------------------------------------------------------------------------
//  // ru   |      |                 |                |                   |                       | других нет
//  // Ord. |      |                 |                |                   |                       | %1-й день 
//  // ------------------------------------------------------------------------------------------------------------
//  // en   |      | для 1           |                |                   |                       | остальное
//  // Card.|      | left %1 day     |                |                   |                       | left %1 days
//  // ------------------------------------------------------------------------------------------------------------
//  // en   |      | XX1 / X11       | XX2 / X12      | XX3 / X13         |                       | остальное
//  // Ord. |      | %1st day        | %1nd day       | %1rd day          |                       | %1th day.
//
//  // Card. - Cardinal - Количественное;
//  // Ord.  - Ordinal  - Порядковое;
//  // X - любая цифра;
//  // / - кроме.
//  
//  Строка = СтроковыеФункцииКлиентСервер.СтрокаСЧисломДляЛюбогоЯзыка(
//		НСтр("ru=';остался %1 день;;осталось %1 дня;осталось %1 дней;осталось %1 дня';
//		     |en=';left %1 day;;;;left %1 days'"), 
//		0.05,, "ЧДЦ=1");
// 
Функция СтрокаСЧисломДляЛюбогоЯзыка(Шаблон, Число, Вид = Неопределено, ФорматнаяСтрока = Неопределено) Экспорт

	Если ПустаяСтрока(Шаблон) Тогда
		Возврат Формат(Число, ФорматнаяСтрока);
	КонецЕсли;

	Если Вид = Неопределено Тогда
		Вид = ВидЧисловогоЗначения.Количественное;
	КонецЕсли;

	Возврат СтрокаСЧислом(Шаблон, Число, Вид, ФорматнаяСтрока);

КонецФункции


// Возвращает наименование, соответствущее идентификатору 
// (как автоматическое заполнение синонима при указании наименования объекта метаданных)
//
// Параметры:
//  Идентификатор	 - Строка - 
// 
// Возвращаемое значение:
//   - Строка
//
Функция ПредставлениеИдентификатора(Идентификатор) Экспорт
	
	Длина = СтрДлина(Идентификатор);
	Наименование = Лев(Идентификатор, 1);
	Для Сч = 2 ПО Длина Цикл
		Символ = Сред(Идентификатор, Сч, 1);
		Если ВРЕГ(Символ) = Символ И НРЕГ(Символ) <> Символ Тогда
			Наименование = Наименование + " " + НРЕГ(Символ);
		ИначеЕсли Символ = "_" Тогда
			Наименование = Наименование + " ";
		Иначе
			Наименование = Наименование + Символ;
		КонецЕсли;
	КонецЦикла;
	Возврат Наименование;
	
КонецФункции


// Возвращает число, которое указано в конце строк
// 
// Параметры:
// 	Значение - строка из которой нужно получить число
// Возвращаемое значение:
// Число - Число указанное в конце строка. Неопределено- если числа в конце строки нет	
// 
Функция ЧислоВКонцеСтроки(Знач Значение) Экспорт
	
	ТекЗначение=Значение;
	КоличествоСимволовСправа=0;
	Пока ТолькоЦифрыВСтроке(Прав(ТекЗначение, 1)) Цикл
		КоличествоСимволовСправа=КоличествоСимволовСправа + 1;
		УдалитьПоследнийСимволВСтроке(ТекЗначение, 1);
	КонецЦикла;
	
	Если ЗначениеЗаполнено(КоличествоСимволовСправа) Тогда
		Возврат СтрокаВЧисло(Прав(Значение, КоличествоСимволовСправа));
	Иначе 
		Возврат Неопределено;
	КонецЕсли;
КонецФункции

// Оборачивает строку в кавычки, если еще не обернута
Функция ОбернутьВКавычки(Знач Строка) Экспорт
	
	Если Лев(Строка, 1) = """" и Прав(Строка, 1) = """" Тогда
		Возврат Строка;
	Иначе
		Возврат """" + Строка + """";
	КонецЕсли;
	
КонецФункции

// Убирает начальные и конечные кавычки из переданной строки
Функция ПутьБезКавычек(Знач Стр) Экспорт
	
	Если Лев(Стр, 1) = """" и Прав(Стр, 1) = """" Тогда
		Возврат Сред(Стр, 2 , СтрДлина(Стр) - 2);
	Иначе
		Возврат Стр;
	КонецЕсли;
	
КонецФункции 

// Аналог платформенной функции СтрНачинаетсяС
Функция СтрокаНачинаетсяСПодстроки(АнализируемаяСтрока, Подстрока) Экспорт
	Возврат Лев(АнализируемаяСтрока, СтрДлина(Подстрока))= Подстрока;
КонецФункции

// Аналог платформенной функции СтрЗаканчиваетсяНа
Функция СтрокаЗаканчиваетсяПодстрокой(АнализируемаяСтрока, Подстрока) Экспорт
	Возврат Прав(АнализируемаяСтрока, СтрДлина(Подстрока))=Подстрока
КонецФункции

// Устарела. Следует использовать СтрНайти.
//
// Осуществляет поиск символа, начиная с конца строки.
//
// Параметры:
//  Строка - Строка - строка, в которой осуществляется поиск;
//  Символ - Строка - искомый символ. Допускается искать строку, содержащую более одного символа.
//
// Возвращаемое значение:
//  Число - позиция символа в строке. 
//          Если строка не содержит указанного символа, то возвращается 0.
//
Функция НайтиСимволСКонца(Знач Строка, Знач Символ) Экспорт
	
	Для Позиция = -СтрДлина(Строка) По -1 Цикл
		Если Сред(Строка, -Позиция, СтрДлина(Символ)) = Символ Тогда
			Возврат -Позиция;
		КонецЕсли;
	КонецЦикла;
	
	Возврат 0;
		
КонецФункции



#КонецОбласти

#Область СлужебныеПроцедурыИФункции

// Выполняет преобразование цифры в римскую нотацию. 
//
// Параметры:
//	Цифра - Число - цифра от 0 до 9.
//  РимскаяЕдиница, РимскаяПятерка, РимскаяДесятка - Строка - символы, соответствующие римским цифрам.
//
// Возвращаемое значение
//	Строка - цифра в римской нотации.
//
// Пример: 
//	СтроковыеФункцииКлиентСервер.ПреобразоватьЦифруВРимскуюНотацию(7,"I","V","X") = "VII".
//
Функция ПреобразоватьЦифруВРимскуюНотацию(Цифра, РимскаяЕдиница, РимскаяПятерка, РимскаяДесятка)

	РимскаяЦифра="";
	Если Цифра = 1 Тогда
		РимскаяЦифра = РимскаяЕдиница;
	ИначеЕсли
	Цифра = 2 Тогда
		РимскаяЦифра = РимскаяЕдиница + РимскаяЕдиница;
	ИначеЕсли Цифра = 3 Тогда
		РимскаяЦифра = РимскаяЕдиница + РимскаяЕдиница + РимскаяЕдиница;
	ИначеЕсли Цифра = 4 Тогда
		РимскаяЦифра = РимскаяЕдиница + РимскаяПятерка;
	ИначеЕсли Цифра = 5 Тогда
		РимскаяЦифра = РимскаяПятерка;
	ИначеЕсли Цифра = 6 Тогда
		РимскаяЦифра = РимскаяПятерка + РимскаяЕдиница;
	ИначеЕсли Цифра = 7 Тогда
		РимскаяЦифра = РимскаяПятерка + РимскаяЕдиница + РимскаяЕдиница;
	ИначеЕсли Цифра = 8 Тогда
		РимскаяЦифра = РимскаяПятерка + РимскаяЕдиница + РимскаяЕдиница + РимскаяЕдиница;
	ИначеЕсли Цифра = 9 Тогда
		РимскаяЦифра = РимскаяЕдиница + РимскаяДесятка;
	КонецЕсли;
	Возврат РимскаяЦифра;

КонецФункции

// Вставляет параметры в строку, учитывая, что в параметрах могут использоваться подстановочные слова %1, %2 и т.д.
Функция ПодставитьПараметрыСПроцентом(Знач СтрокаПодстановки, Знач Параметр1, Знач Параметр2 = Неопределено,
	Знач Параметр3 = Неопределено, Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено,
	Знач Параметр6 = Неопределено, Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено,
	Знач Параметр9 = Неопределено)

	Результат = "";
	Позиция = СтрНайти(СтрокаПодстановки, "%");
	Пока Позиция > 0 Цикл
		Результат = Результат + Лев(СтрокаПодстановки, Позиция - 1);
		СимволПослеПроцента = Сред(СтрокаПодстановки, Позиция + 1, 1);
		ПодставляемыйПараметр = Неопределено;
		Если СимволПослеПроцента = "1" Тогда
			ПодставляемыйПараметр = Параметр1;
		ИначеЕсли СимволПослеПроцента = "2" Тогда
			ПодставляемыйПараметр = Параметр2;
		ИначеЕсли СимволПослеПроцента = "3" Тогда
			ПодставляемыйПараметр = Параметр3;
		ИначеЕсли СимволПослеПроцента = "4" Тогда
			ПодставляемыйПараметр = Параметр4;
		ИначеЕсли СимволПослеПроцента = "5" Тогда
			ПодставляемыйПараметр = Параметр5;
		ИначеЕсли СимволПослеПроцента = "6" Тогда
			ПодставляемыйПараметр = Параметр6;
		ИначеЕсли СимволПослеПроцента = "7" Тогда
			ПодставляемыйПараметр = Параметр7;
		ИначеЕсли
		СимволПослеПроцента = "8" Тогда
			ПодставляемыйПараметр = Параметр8;
		ИначеЕсли СимволПослеПроцента = "9" Тогда
			ПодставляемыйПараметр = Параметр9;
		КонецЕсли;
		Если ПодставляемыйПараметр = Неопределено Тогда
			Результат = Результат + "%";
			СтрокаПодстановки = Сред(СтрокаПодстановки, Позиция + 1);
		Иначе
			Результат = Результат + ПодставляемыйПараметр;
			СтрокаПодстановки = Сред(СтрокаПодстановки, Позиция + 2);
		КонецЕсли;
		Позиция = СтрНайти(СтрокаПодстановки, "%");
	КонецЦикла;
	Результат = Результат + СтрокаПодстановки;

	Возврат Результат;
КонецФункции

Функция СоответствиеНациональногоАлфавитаИЛатиницы()
	// Транслитерация, используемая в загранпаспортах 1997-2010.
	Соответствие = Новый Соответствие;
	Соответствие.Вставить("а", "a");
	Соответствие.Вставить("б", "b");
	Соответствие.Вставить("в", "v");
	Соответствие.Вставить("г", "g");
	Соответствие.Вставить("д", "d");
	Соответствие.Вставить("е", "e");
	Соответствие.Вставить("ё", "e");
	Соответствие.Вставить("ж", "zh");
	Соответствие.Вставить("з", "z");
	Соответствие.Вставить("и", "i");
	Соответствие.Вставить("й", "y");
	Соответствие.Вставить("к", "k");
	Соответствие.Вставить("л", "l");
	Соответствие.Вставить("м", "m");
	Соответствие.Вставить("н", "n");
	Соответствие.Вставить("о", "o");
	Соответствие.Вставить("п", "p");
	Соответствие.Вставить("р", "r");
	Соответствие.Вставить("с", "s");
	Соответствие.Вставить("т", "t");
	Соответствие.Вставить("у", "u");
	Соответствие.Вставить("ф", "f");
	Соответствие.Вставить("х", "kh");
	Соответствие.Вставить("ц", "ts");
	Соответствие.Вставить("ч", "ch");
	Соответствие.Вставить("ш", "sh");
	Соответствие.Вставить("щ", "shch");
	Соответствие.Вставить("ъ", ""); // пропускается
	Соответствие.Вставить("ы", "y");
	Соответствие.Вставить("ь", ""); // пропускается
	Соответствие.Вставить("э", "e");
	Соответствие.Вставить("ю", "yu");
	Соответствие.Вставить("я", "ya");

	Возврат Соответствие;
КонецФункции

#КонецОбласти